import type { ReactNode } from 'react';
import type { 
  ICourse, 
  ICourseCreateRequest, 
  ICourseUpdateRequest, 
  ICourseQueryParams,
  ICourseSummary,
  ICourseDetail
} from './course';
import type {
  ICourseCategory,
  ICourseCategoryCreateRequest,
  ICourseCategoryUpdateRequest,
  ICourseCategoryQueryParams,
  ICourseCategoryTreeNode,
  ICourseCategorySummary
} from './courseCategory';
import type { CourseActionEnum, CourseCategoryActionEnum } from './enums';

// ==================== 课程组件 Props 类型 ====================

/**
 * 课程卡片组件 Props
 * @description 课程卡片组件的属性接口
 */
export interface ICourseCardProps {
  /** 课程信息 */
  course: ICourse;
  /** 课程分类信息 */
  categories?: ICourseCategory[];
  /** 是否显示详细信息 */
  showDetails?: boolean;
  /** 是否可编辑 */
  editable?: boolean;
  /** 是否可删除 */
  deletable?: boolean;
  /** 是否显示操作按钮 */
  showActions?: boolean;
  /** 自定义操作按钮 */
  actions?: ReactNode;
  /** 点击编辑回调 */
  onEdit?: (course: ICourse) => void;
  /** 点击删除回调 */
  onDelete?: (courseId: string) => void;
  /** 点击查看课表回调 */
  onViewSchedule?: (courseId: string) => void;
  /** 点击卡片回调 */
  onClick?: (course: ICourse) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

/**
 * 课程表单组件 Props
 * @description 课程表单组件的属性接口
 */
export interface ICourseFormProps {
  /** 编辑的课程信息（编辑模式时传入） */
  course?: ICourse;
  /** 可选的课程分类列表 */
  categories: ICourseCategory[];
  /** 表单模式 */
  mode?: 'create' | 'edit' | 'view';
  /** 是否显示表单 */
  visible: boolean;
  /** 是否只读模式 */
  readonly?: boolean;
  /** 表单标题 */
  title?: string;
  /** 提交回调 */
  onSubmit: (data: ICourseCreateRequest | ICourseUpdateRequest) => void | Promise<void>;
  /** 取消回调 */
  onCancel: () => void;
  /** 表单验证失败回调 */
  onValidationError?: (errors: Record<string, string>) => void;
  /** 是否提交中 */
  loading?: boolean;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课程列表组件 Props
 * @description 课程列表组件的属性接口
 */
export interface ICourseListProps {
  /** 课程列表数据 */
  courses: ICourse[];
  /** 课程分类数据 */
  categories?: ICourseCategory[];
  /** 是否加载中 */
  loading?: boolean;
  /** 列表为空时的提示 */
  emptyText?: string;
  /** 是否显示分页 */
  showPagination?: boolean;
  /** 当前页码 */
  currentPage?: number;
  /** 每页数量 */
  pageSize?: number;
  /** 总数量 */
  total?: number;
  /** 是否可选择 */
  selectable?: boolean;
  /** 选中的课程ID列表 */
  selectedCourseIds?: string[];
  /** 是否显示操作列 */
  showActions?: boolean;
  /** 自定义列配置 */
  columns?: Array<{
    key: keyof ICourse;
    title: string;
    width?: number;
    render?: (value: any, course: ICourse) => ReactNode;
  }>;
  /** 选择变化回调 */
  onSelectionChange?: (selectedIds: string[]) => void;
  /** 编辑课程回调 */
  onEdit?: (course: ICourse) => void;
  /** 删除课程回调 */
  onDelete?: (courseId: string) => void;
  /** 查看课程详情回调 */
  onView?: (course: ICourse) => void;
  /** 查看课程课表回调 */
  onViewSchedule?: (courseId: string) => void;
  /** 分页变化回调 */
  onPageChange?: (page: number, pageSize: number) => void;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课程搜索组件 Props
 * @description 课程搜索组件的属性接口
 */
export interface ICourseSearchProps {
  /** 搜索关键词 */
  keyword?: string;
  /** 高级筛选条件 */
  filters?: ICourseQueryParams;
  /** 可选的课程分类列表 */
  categories?: ICourseCategory[];
  /** 是否显示高级筛选 */
  showAdvancedFilters?: boolean;
  /** 搜索占位符 */
  placeholder?: string;
  /** 是否显示搜索建议 */
  showSuggestions?: boolean;
  /** 搜索建议列表 */
  suggestions?: Array<{
    id: string;
    name: string;
    courseCode: string;
    teacher: string;
    highlight?: string;
  }>;
  /** 搜索回调 */
  onSearch: (keyword: string, filters?: ICourseQueryParams) => void;
  /** 重置搜索回调 */
  onReset?: () => void;
  /** 筛选条件变化回调 */
  onFiltersChange?: (filters: ICourseQueryParams) => void;
  /** 选择搜索建议回调 */
  onSuggestionSelect?: (course: { id: string; name: string; courseCode: string }) => void;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课程选择器组件 Props
 * @description 课程选择器组件的属性接口
 */
export interface ICourseSelectorProps {
  /** 课程列表 */
  courses?: ICourseSummary[];
  /** 选中的课程ID列表 */
  selectedCourseIds: string[];
  /** 是否多选 */
  multiple?: boolean;
  /** 是否禁用 */
  disabled?: boolean;
  /** 占位符 */
  placeholder?: string;
  /** 是否显示搜索 */
  showSearch?: boolean;
  /** 是否显示全选 */
  showSelectAll?: boolean;
  /** 最大选择数量 */
  maxCount?: number;
  /** 筛选条件 */
  filters?: ICourseQueryParams;
  /** 选择变化回调 */
  onChange: (selectedIds: string[]) => void;
  /** 搜索回调 */
  onSearch?: (keyword: string) => void;
  /** 自定义渲染选项 */
  renderOption?: (course: ICourseSummary) => ReactNode;
  /** 自定义样式类名 */
  className?: string;
}

// ==================== 课程分类组件 Props 类型 ====================

/**
 * 课程分类卡片组件 Props
 * @description 课程分类卡片组件的属性接口
 */
export interface ICourseCategoryCardProps {
  /** 课程分类信息 */
  category: ICourseCategory;
  /** 分类下的课程数量 */
  courseCount: number;
  /** 是否可编辑 */
  editable?: boolean;
  /** 是否可删除 */
  deletable?: boolean;
  /** 是否显示操作按钮 */
  showActions?: boolean;
  /** 自定义操作按钮 */
  actions?: ReactNode;
  /** 点击编辑回调 */
  onEdit?: (category: ICourseCategory) => void;
  /** 点击删除回调 */
  onDelete?: (categoryId: string) => void;
  /** 点击查看课程回调 */
  onViewCourses?: (categoryId: string) => void;
  /** 点击卡片回调 */
  onClick?: (category: ICourseCategory) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

/**
 * 课程分类表单组件 Props
 * @description 课程分类表单组件的属性接口
 */
export interface ICourseCategoryFormProps {
  /** 编辑的课程分类信息（编辑模式时传入） */
  category?: ICourseCategory;
  /** 可选的父分类列表 */
  parentCategories?: ICourseCategory[];
  /** 表单模式 */
  mode?: 'create' | 'edit' | 'view';
  /** 是否显示表单 */
  visible: boolean;
  /** 是否只读模式 */
  readonly?: boolean;
  /** 表单标题 */
  title?: string;
  /** 提交回调 */
  onSubmit: (data: ICourseCategoryCreateRequest | ICourseCategoryUpdateRequest) => void | Promise<void>;
  /** 取消回调 */
  onCancel: () => void;
  /** 表单验证失败回调 */
  onValidationError?: (errors: Record<string, string>) => void;
  /** 是否提交中 */
  loading?: boolean;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课程分类选择器组件 Props
 * @description 课程分类选择器组件的属性接口
 */
export interface ICourseCategorySelectorProps {
  /** 课程分类列表 */
  categories: ICourseCategory[];
  /** 选中的分类ID列表 */
  selectedCategoryIds: string[];
  /** 是否多选 */
  multiple?: boolean;
  /** 是否禁用 */
  disabled?: boolean;
  /** 占位符 */
  placeholder?: string;
  /** 是否显示搜索 */
  showSearch?: boolean;
  /** 是否显示全选 */
  showSelectAll?: boolean;
  /** 最大选择数量 */
  maxCount?: number;
  /** 是否显示树形结构 */
  treeMode?: boolean;
  /** 是否可以选择父节点 */
  allowSelectParent?: boolean;
  /** 选择变化回调 */
  onChange: (selectedIds: string[]) => void;
  /** 搜索回调 */
  onSearch?: (keyword: string) => void;
  /** 自定义渲染选项 */
  renderOption?: (category: ICourseCategory) => ReactNode;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课程分类树组件 Props
 * @description 课程分类树组件的属性接口
 */
export interface ICourseCategoryTreeProps {
  /** 分类树数据 */
  treeData: ICourseCategoryTreeNode[];
  /** 是否可选择 */
  selectable?: boolean;
  /** 是否可拖拽 */
  draggable?: boolean;
  /** 是否显示操作按钮 */
  showActions?: boolean;
  /** 选中的节点ID列表 */
  selectedKeys?: string[];
  /** 展开的节点ID列表 */
  expandedKeys?: string[];
  /** 节点选择回调 */
  onSelect?: (selectedKeys: string[], selectedNodes: ICourseCategoryTreeNode[]) => void;
  /** 节点展开回调 */
  onExpand?: (expandedKeys: string[]) => void;
  /** 节点拖拽回调 */
  onDrop?: (info: {
    dragNode: ICourseCategoryTreeNode;
    dropNode: ICourseCategoryTreeNode;
    dropPosition: number;
  }) => void;
  /** 节点操作回调 */
  onAction?: (action: CourseCategoryActionEnum, node: ICourseCategoryTreeNode) => void;
  /** 自定义渲染节点 */
  renderNode?: (node: ICourseCategoryTreeNode) => ReactNode;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课程操作按钮组件 Props
 * @description 课程操作按钮组件的属性接口
 */
export interface ICourseActionButtonsProps {
  /** 课程信息 */
  course: ICourse;
  /** 可用的操作列表 */
  actions?: CourseActionEnum[];
  /** 按钮大小 */
  size?: 'small' | 'middle' | 'large';
  /** 按钮类型 */
  type?: 'default' | 'primary' | 'text' | 'link';
  /** 是否禁用 */
  disabled?: boolean;
  /** 操作回调 */
  onAction: (action: CourseActionEnum, course: ICourse) => void;
  /** 自定义样式类名 */
  className?: string;
}